﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QldtSdh.DAL.Models;

namespace QldtSdh.BLL
{
    public partial class BizChuongTrinhDaoTao
    {
        /// <summary>
        /// Lấy danh sách
        /// </summary>
        /// <returns></returns>
        public static List<ChuongTrinhDaoTao> GetList()
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                return db.ChuongTrinhDaoTaoDbSet.OrderBy(e => e.MaNganhDaoTaoGUID).ThenByDescending(e => e.TenChuongTrinhDaoTao).ToList();
            }
        }

        public static List<ChuongTrinhDaoTao> GetList(string guidIDNganh)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                return db.ChuongTrinhDaoTaoDbSet.Where(e => e.MaNganhDaoTaoGUID == guidIDNganh).OrderByDescending(e => e.TenChuongTrinhDaoTao).ToList();
            }
        }

        /// <summary>
        /// Lấy danh sách đào tạo của một ngành
        /// </summary>
        /// <param name="guidIDNganh"></param>
        /// <returns></returns>
        public static List<ChuongTrinhDaoTao> GetList(string guidIDNganh, string maKhoaHocGUID)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                return db.KhoaHoc_NganhDaoTaoDbSet.Where(e => e.MaNganhDaoTaoGUID == guidIDNganh && e.MaKhoaHocGUID == maKhoaHocGUID).Select(e => e.ChuongTrinhDaoTao).OrderByDescending(e => e.TenChuongTrinhDaoTao).ToList();
            }
        }

        public static ChuongTrinhDaoTao GetByID(string guidIdCTDT, CEMS4UG_DHKHContext dbContext = null)
        {
            if (dbContext != null)
                return dbContext.ChuongTrinhDaoTaoDbSet.Where(e => e.MaChuongTrinhDaoTaoGUID == guidIdCTDT).FirstOrDefault();
            else
                using (var db = CEMS4UG_DHKHContext.GetContext())
                {
                    return db.ChuongTrinhDaoTaoDbSet.Where(e => e.MaChuongTrinhDaoTaoGUID == guidIdCTDT).FirstOrDefault();
                }
        }

        //public static bool IsExistByID(string guidIdCTDT)
        //{
        //    using (var db = CEMS4UG_DHKHContext.GetContext())
        //    {
        //        return db.ChuongTrinhDaoTaoDbSet.Where(e => e.MaChuongTrinhDaoTaoGUID == guidIdCTDT).FirstOrDefault() == null ? false : true;
        //    }
        //}

        ///// <summary>
        ///// Kiểm tra tên có trùng hay không
        ///// </summary>
        ///// <param name="id"></param>
        ///// <returns></returns>
        //public static bool IsExistByName(string tenCTDT)
        //{
        //    using (var db = CEMS4UG_DHKHContext.GetContext())
        //    {
        //        return db.ChuongTrinhDaoTaoDbSet.Where(e => e.TenChuongTrinhDaoTao == tenCTDT).FirstOrDefault() == null ? false : true;
        //    }
        //}

        public static void Add(ChuongTrinhDaoTao obj)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var ct = db.ChuongTrinhDaoTaoDbSet.Where(e => e.TenChuongTrinhDaoTao == obj.TenChuongTrinhDaoTao).FirstOrDefault();
                if (ct != null)
                    throw new InvalidNameException(string.Format("Đã có chương trình đào tạo với tên \"{0}\" trên hệ thống", obj.TenChuongTrinhDaoTao));
                //obj.MaChuongTrinhDaoTaoGUID = Guid.NewGuid().ToString();
                //obj.SoHocKyDaoTao = 4;
                db.ChuongTrinhDaoTaoDbSet.Add(obj);
                BizNhatKyHoatDong.LogAndCommitInsert2(obj, obj.MaChuongTrinhDaoTaoGUID, LOAIDOITUONG.CHƯƠNG_TRÌNH_ĐÀO_TẠO, db);
            }
        }

        /// <summary>
        /// Cập nhật chương trình đào tạo
        /// </summary>
        /// <param name="obj"></param>
        public static void Update(ChuongTrinhDaoTao obj)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var ct = db.ChuongTrinhDaoTaoDbSet
                    .Where(e => e.TenChuongTrinhDaoTao == obj.TenChuongTrinhDaoTao &&
                        e.MaChuongTrinhDaoTaoGUID != obj.MaChuongTrinhDaoTaoGUID).FirstOrDefault();
                if (ct != null)
                    throw new InvalidNameException(string.Format("Đã có chương trình đào tạo với tên \"{0}\" trên hệ thống", obj.TenChuongTrinhDaoTao));
                ct = db.ChuongTrinhDaoTaoDbSet
                    .Where(e => e.MaChuongTrinhDaoTaoGUID == obj.MaChuongTrinhDaoTaoGUID).FirstOrDefault();
                if (ct == null)
                    throw new InvalidObjectException("Chương trình đào tạo không còn tồn tại trên hệ thống");
                ct.MaNganhDaoTaoGUID = obj.MaNganhDaoTaoGUID;
                ct.TenChuongTrinhDaoTao = obj.TenChuongTrinhDaoTao;
                ct.SoTinChiTuChonPhaiChonTrongPhanChung = obj.SoTinChiTuChonPhaiChonTrongPhanChung;
                ct.SoTinChiTuChonPhaiChonTrongPhanChuyenNganh = obj.SoTinChiTuChonPhaiChonTrongPhanChuyenNganh;
                ct.SoTinChiTuChonPhaiChonTrongPhanCoSo = obj.SoTinChiTuChonPhaiChonTrongPhanCoSo;
                ct.SoHocKyDaoTao = 6;
                BizNhatKyHoatDong.LogAndCommitUpdate2(obj, ct, obj.MaChuongTrinhDaoTaoGUID, LOAIDOITUONG.CHƯƠNG_TRÌNH_ĐÀO_TẠO, db);
            }
        }

        /// <summary>
        /// Xoá chương trình đào tạo khỏi hệ thống (có kiểm tra điều kiện phụ thuộc dữ liệu trước khi xoá)
        /// </summary>
        /// <param name="guidIdChuongTrinhDaoTao"></param>
        public static void Delete(string guidIdChuongTrinhDaoTao)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var ct = db.ChuongTrinhDaoTaoDbSet
                    .Where(e => e.MaChuongTrinhDaoTaoGUID == guidIdChuongTrinhDaoTao)
                    .FirstOrDefault();
                if (ct == null)
                    throw new InvalidObjectException("Chương trình đào tạo không còn tồn tại trên hệ thống");
                if ((ct.ChuongTrinhDaoTao_HocPhan != null && ct.ChuongTrinhDaoTao_HocPhan.Count > 0))
                    throw new Exception("Chương trình đào tạo còn chứa thông tin các học phần");
                var stKhoaHocSuDung = "";
                if (ct.KhoaHoc_NganhDaoTao != null)
                {
                    foreach (var khoaHoc in ct.KhoaHoc_NganhDaoTao)
                        stKhoaHocSuDung += string.Format("Ngành {0} ({1})\r\n", khoaHoc.NganhDaoTao.TenNganhDaoTao, khoaHoc.KhoaHoc.TenKhoaHoc);
                }
                if (string.IsNullOrEmpty(stKhoaHocSuDung) == false)
                    throw new Exception(string.Format("Chương trình đào tạo đang còn được sử dụng bởi\r\n{0}", stKhoaHocSuDung));
                db.ChuongTrinhDaoTaoDbSet.Remove(ct);
                BizNhatKyHoatDong.LogAndCommitDelete2(ct, ct.MaChuongTrinhDaoTaoGUID, LOAIDOITUONG.CHƯƠNG_TRÌNH_ĐÀO_TẠO, db);
            }
        }

        /// <summary>
        /// Lấy danh sách các học phần trong chương trình đào tạo để xét có đủ điều kiện tốt nghiệp không
        /// </summary>
        /// <param name="hocVien"></param>
        /// <param name="lop"></param>
        /// <param name="duDieuKien"></param>
        /// <returns></returns>
        public static List<ChuongTrinhDaoTao_HocPhan> LoadCTDT(HocVien hocVien, LopKhoaNganh lop, out bool duDieuKien)
        {
            int tcKienThucChung = 0, tcKienThucCoSo = 0, tcKienThucChuyenNganh = 0;
            bool duDK = true;
            List<ChuongTrinhDaoTao_HocPhan> ls = null;
            if (hocVien != null && lop != null)
            {
                var khoa_nganh = BizKhoaHoc_NganhDaoTao.GetByID(lop.MaDaoTaoKhoaNganhGUID);
                if (khoa_nganh != null)
                {
                    var ctdt = BizChuongTrinhDaoTao.GetByID(khoa_nganh.MaChuongTrinhDaoTaoGUID);
                    ls = BizChuongTrinhDaoTao_HocPhan.GetList(khoa_nganh.MaChuongTrinhDaoTaoGUID);
                    if (ls != null && ls.Count > 0 && ctdt != null)
                    {
                        var kqht = BizHocVien_KetQuaHocTap.GetList(hocVien.MaHocVien);
                        foreach (var item in ls)
                        {
                            var kq = kqht.Find(e => e.MaHocPhanGUID == item.MaHocPhan);
                            if (kq != null)
                            {
                                item.Diem = (double)kq.DiemHe10;
                                if (item.Diem < 5)
                                    duDK = false;
                                if (!item.LaHocPhanBatBuoc)
                                {
                                    switch (item.KhoiKienThuc)
                                    {
                                        case (int)KHOIKIENTHUC.KIENTHUCCHUNG:
                                            tcKienThucChung += item.SoTinChi;
                                            break;
                                        case (int)KHOIKIENTHUC.KIENTHUCCHUYENNGANH:
                                            tcKienThucChuyenNganh += item.SoTinChi;
                                            break;
                                        case (int)KHOIKIENTHUC.KIENTHUCCOSO:
                                            tcKienThucCoSo += item.SoTinChi;
                                            break;
                                    }
                                }
                            }
                            else if (item.LaHocPhanBatBuoc)
                                duDK = false;
                        }
                        if (duDK)
                        {
                            if (!(ctdt.SoTinChiTuChonPhaiChonTrongPhanChung == tcKienThucChung &&
                                ctdt.SoTinChiTuChonPhaiChonTrongPhanChuyenNganh == tcKienThucChuyenNganh &&
                                ctdt.SoTinChiTuChonPhaiChonTrongPhanCoSo == tcKienThucCoSo))
                                duDK = false;
                        }
                        if (duDK)
                        {
                            decimal dlv = (decimal)5.5;
                            if (!(hocVien.DiemLuanVan.HasValue && hocVien.DiemLuanVan.Value >= dlv))
                                duDK = false;
                        }
                    }
                    else
                        duDK = false;
                }
                else
                    duDK = false;
            }
            else
                duDK = false;
            duDieuKien = duDK;
            return ls;
        }
    }

}
